/* 
 * File:   bitrotate.c
 * Author: Rick
 *
 * Created on March 29, 2012, 12:50 PM
 */

#include <stdio.h>
#include <stdlib.h>
 
// nu klopt ie voor de helft
// omdat je het linker / rechter stukje mist
// bv dit:
// 00100
// wordt
// 01000
// maar dit:
// 10000
// wordt:
// 00000
// moet worden:
// 00001
// i know dat is met logische en Arithmetic shift?/
//en C ondersteunt alleen logical toch?
    // tis veel makkelijker :P
// het linker gedeelte laat ik nu zien
// dit nu OR'ren
// 32 hangt af van integer grootte uiteraard
// dus:
// oke maar waarom die 32 - amount?
// stel je hebt 8 bit integer (=char/byte)
// 00100000  je doet << 5 ofzo
// 00000100  (ik hoop dat ik het goed heb geteld :P)
// maar je pakt het stukje van 8-5=3
// en zet heb aan de andere kant..
///aaaaah dus je pak een gedeelte van de link of de recht kan op en verplaatst het:)
// jep 
// rotateRight is hetzelfde alleen die shifts andersom
// en die pipe? OR operator
// samenvoegen dus
// 010 | 001 = 011
// oke VET!
// had geen idee dat het kon zo:)

int rotateLeft(int* in ,int amount){
    int rechter = (*in >> (32 - amount));
    return (*in << amount) | rechter;
    // return( in >> amount) << (sizeof(unsigned int)*8 - amount)) : (in << amount)  | ((in & ~((sizeof(unsigned int)*8*8 - 1) >> amount)));
    
}

int rotateRight(int* in, int amount){
    int linker = (*in >> (32 - amount));
    return (*in >> amount) | linker;
}
